package page

import (
	result2 "gin-ranking/api/auth/result"
	"gorm.io/gorm"
)

type T interface {
	[]result2.UserResult
}

type Dto struct {
	PageNo   int `form:"pageNo" json:"pageNo"`
	PageSize int `form:"pageSize" json:"pageSize"`
}

// Result 分页查询返回
type Result[K T] struct {
	PageNo   int   `form:"pageNo" json:"pageNo"`
	PageSize int   `form:"pageSize" json:"pageSize"`
	Total    int64 `json:"total"`   // 总条数
	Records  K     `json:"records"` // 返回数据
}

func Init(pageNo int, pageSize int) Dto {
	if pageNo == 0 {
		pageNo = 1
	}
	if pageSize <= 0 {
		pageSize = 10
	}
	return Dto{PageNo: pageNo, PageSize: pageSize}
}

func Data[K T](pageDto Dto, total int64, data K) Result[K] {
	r := Result[K]{PageNo: pageDto.PageNo, PageSize: pageDto.PageSize, Total: total, Records: data}
	return r
}

func CountSql(sql string) string {
	return "SELECT COUNT(1)  FROM (" + sql + ") a"
}

//func Paginate[K T](db *gorm.DB, sql string, pageDto Dto, data K) Result[K] {
//
//	var total int64
//	err := db.Raw(CountSql(sql)).Count(&total).Error
//	if err != nil {
//		panic(result.FailMag(err.Error()))
//	}
//	if err := db.Raw(sql).Limit(pageDto.PageSize).Offset((pageDto.PageNo - 1) * pageDto.PageSize).Find(&data).Error; err != nil {
//		panic(result.FailMag(err.Error()))
//	}
//	return Data(pageDto, total, data)
//}

// Paginate 构建分页查询
func Paginate(req *Dto) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		page := req.PageNo
		if page == 0 {
			page = 1
		}
		pageSize := req.PageSize
		switch {
		case pageSize > 100:
			pageSize = 100
		case pageSize <= 0:
			pageSize = 10
		}
		offset := (page - 1) * pageSize
		return db.Offset(offset).Limit(pageSize)
	}
}
